package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.SegJugadorService;
import es.tikitaka.domain.jugador.PartJugador;
import es.tikitaka.domain.jugador.SegJugador;
import es.tikitaka.domain.liga.Jornada;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("segJugadorService")
public class SegJugadorServiceImpl implements SegJugadorService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public SegJugadorServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para listar todos los seguimientos de jugadores en el sistema
	 * 
	 * @return lista de seguimientos
	 */
	@SuppressWarnings("unchecked")
	public List<SegJugador> getList() {
		List<SegJugador> list = null;
		try {
			list = em.createQuery("select s from SegJugador s").getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método que devuelve el seguimiento de un jugador para una jornada
	 * concreta
	 * 
	 * @param participacion
	 * @param jornada
	 * @return
	 */
	public SegJugador getSeguimientoJornada(PartJugador participacion,
			Jornada jornada) {
		SegJugador seguimiento = new SegJugador();
		try {
			seguimiento = (SegJugador) em
					.createQuery(
							"select s from SegJugador s join fetch s.segEquipo e where s.partJugador.id =:participacion and e.partido.jornada.id =:jornada")
					.setParameter("participacion", participacion.getId())
					.setParameter("jornada", jornada.getId()).getSingleResult();
		} catch (NoResultException e) {
			e.printStackTrace();
			seguimiento = null;
		}
		return seguimiento;
	}

	/**
	 * 
	 * @param seguimiento
	 * @return
	 */
	public SegJugador merge(SegJugador seguimiento) {
		em.refresh(seguimiento);
		return em.merge(seguimiento);
	}

	/**
	 * Método para eliminar del sistema un seguimiento de jugador dado
	 * 
	 * @param id
	 *            Id del seguimiento de jugador a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			SegJugador seg = em.getReference(SegJugador.class, id);
			em.remove(seg);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para guardar un seguimiento de jugador en el sistema o las
	 * modificaciones sufridas por un seguimiento ya existente
	 * 
	 * @param seguimiento
	 *            Seguimiento de jugador a guardar
	 * @return estado el proceso (true or false)
	 */
	public boolean save(SegJugador seguimiento) {
		boolean correcto;
		try {
			em.persist(seguimiento);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
